/*
 * raid.h
 *
 *  Created on: 18/09/2011
 *      Author: utn_so
 */

#ifndef RAID_H_
#define RAID_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "archivoConfiguracion.h"
#include "funcionesNodos.h"
#include "funcionesRaid.h"
#include "Sockets.h"
#include "funcionesSelect.h"
#include "funcionesNIPC.h"
#include <pthread.h>
#include "log.h"
#include <semaphore.h>
#define TAMANIO_SECTOR 512
#define BACKLOG 20
pthread_t hilito;



pthread_mutex_t mutexSincro;
pthread_mutex_t mutexFinalizar;

pthread_mutex_t mutexArchConfig;

pthread_mutex_t mutexSecTot;

pthread_mutex_t mutexPtroSelectAux;

pthread_mutex_t mutexPtroFte;

pthread_mutex_t mutexPtroFteEsc;

pthread_mutex_t mutexPtroFteEscritura;

pthread_mutex_t mutexDescriptor;

pthread_mutex_t mutexPtroFteSelectAux;
pthread_mutex_t mutexPtroFinEsc;

pthread_mutex_t mutexPtroBackup;
pthread_mutex_t mutexDescriptorASincronizar;
pthread_mutex_t mutexPtroLectura;

stConfiguracion stConfig;
//estructura parametros threadPD
struct stThreadParameters {
int32_t ficheroCliente;
int32_t acumulador;

/*
0 handshake
2 lectura
3 respuesta ppd para el fs
4 respuesta ppd para otro ppd
*/



estructuraLeer *colaLectura;
estructuraEscribir *colaEscritura;
estructuraEscribir *colaSincronizacion;

}typedef stThreadParameters;

struct listaSelect *punteroFileSystem;
struct listaSelect *punteroFteSelect;
struct listaSelect *punteroFinSelect;


struct estructuraEscribir *punteroFrenteEscribir;
struct estructuraEscribir *punteroFinEscribir;


struct estructuraEscribir *punteroFrenteSincro;
struct estructuraEscribir *punteroFinSincro;

struct estructuraLeer *punteroEstructuraLeer;
struct estructuraLeer *punteroFrenteLeer;
struct estructuraLeer *punteroFinLeer;

int32_t socketServidor;
int32_t sincronizador;
int32_t ultimoLeido; //cuando el nodo del select del dispositivo a sincronizar ya cambia su status a OK ahi hay que poner esta variable en 0
int32_t ultimoEscrito; //cuando el nodo del select del dispositivo a sincronizar ya cambia su status a OK ahi hay que poner esta variable en 0
int32_t descriptorASincronizar;
int32_t sectoresTotales;
int32_t finalizar;
int32_t anterior;
int32_t descriptorCaido;



char identificadorPPDSincro[20];
/* Prototipos de las funciones definidas en este fichero */
void clienteNuevo_agregar (int32_t servidor, struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect);
int32_t descriptorMaximo_detectar (struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect);
void descriptoresCaidos_detectar (struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect);
int32_t clientes_determinarCantidad(struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect);



pthread_mutex_t mutexLog;
t_log * log;

int32_t fs_elegirAEnviar();
void *hilo_Funcion(void);
int32_t hilo_crear(void);
int32_t planificadores_buscar();

void descriptor_cambiarStatus (struct listaSelect **punteroFteSelect,struct listaSelect **punteroFinSelect,int32_t descriptorASincronizar);
#endif /* RAID_H_ */
